package biz.datalk.industrialland.common.validated.validator;

import biz.datalk.industrialland.common.validated.PhoneValidation;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

/**
 * @author tarofang@163.com
 * @date 2019-08-19
 */
public class PhoneValidationValidator implements ConstraintValidator<PhoneValidation, String> {
    @Override
    public void initialize(PhoneValidation constraintAnnotation) {
        // System.out.println("xxxxxxx" + constraintAnnotation);
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        // STEP Number 校验号码是否为空
        if (value == null || value.length() == 0) {
            return true;
            
        }
        
        // STEP Number 校验国际码/区号
        if (value.contains("-")) {
            // SUBSTEP Number 分隔号码（仅支持三段式国际号码，国内号码不允许加区号）
            String[] parts = value.split("-");
            if (parts.length != 3) {
                return false;
                
            }
            
            // SUBSTEP Number 校验国际码/区号
            String countryCode = parts[0];
            String districtCode = parts[1];
            boolean countryCodeMatches = countryCode.matches("^\\+?[0-9]{1,4}$");
            boolean districtCodeMatches = districtCode.matches("^[0-9]{1,6}$");
            if (!countryCodeMatches || !districtCodeMatches) {
                return false;
                
            }
            
            // SUBSTEP Number 将剩余的数字存储为具体手机号码，进行下一步校验
            value = parts[2];
            
        }
        
        // STEP Number 校验具体的手机号
        // NOTE Number 为了规避相关运营商的号段变动问题，此处只校验手机号码格式，不校验号段
        // NOTE Number 若需要校验号段，可在后期引入动态的校验器或者第三方服务，保证在不修改框架的情况下增删号段
        // return value.matches("^((13[0-9])|(15[^4])|(18[0,2,3,5-9])|(17[0-8])|(147))\\d{8}$");
        return value.matches("^1\\d{10}$");
        
    }
    
}
